package ar.com.sistventa.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import ar.com.sistventa.dao.ArticuloDAO;
import ar.com.sistventa.entities.Articulo;
import ar.com.sistventa.filtros.ArticuloFiltroBusqueda;
import ar.com.sistventa.utils.Constantes;

public class ArticuloDaoImpl extends EntidadDAOImpl<Articulo> implements
		ArticuloDAO {

	@SuppressWarnings("unchecked")
	@Override
	public List<Articulo> busquedaPorFiltro(
			ArticuloFiltroBusqueda articuloFiltroBusqueda)
			throws HibernateException {

		List<Articulo> articuloList = new ArrayList<Articulo>();
		try {
			iniciaConexion();
			Criteria critArticulo = getSession().createCriteria(Articulo.class);
			Criteria critCategoria = null;
			Criteria critMarca = null;

			if (articuloFiltroBusqueda.getCodigo() != null
					&& !articuloFiltroBusqueda.getCodigo().trim().isEmpty()) {
				critArticulo.add(Restrictions.eq("codigo",
						articuloFiltroBusqueda.getCodigo()));

			}
			if (articuloFiltroBusqueda.getDescripcion() != null
					&& !articuloFiltroBusqueda.getDescripcion().trim()
							.isEmpty()) {
				critArticulo.add(Restrictions.like("descripcion",
						articuloFiltroBusqueda.getDescripcion() + "%"));

			}
			if (articuloFiltroBusqueda.getCategoria() != null
					&& !articuloFiltroBusqueda.getCategoria().trim().isEmpty()) {
				critCategoria = critArticulo.createCriteria("categoria");
				critCategoria.add(Restrictions.like("descripcion",
						articuloFiltroBusqueda.getCategoria() + "%"));

			}
			if (articuloFiltroBusqueda.getMarca() != null
					&& !articuloFiltroBusqueda.getMarca().trim().isEmpty()) {
				critMarca = critArticulo.createCriteria("marca");
				critMarca.add(Restrictions.like("descripcion",
						articuloFiltroBusqueda.getMarca() + "%"));

			}
			
			critArticulo.add(Restrictions.eq("estadoLogico", "A"));
			critArticulo.addOrder(Order.asc("descripcion"));
			articuloList = (List<Articulo>) critArticulo.list();

		} catch (HibernateException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			this.getSession().close();
		}
		return articuloList;
	}

	@Override
	public void bajaLogicaArticulo(Articulo articulo) throws HibernateException {
		articulo.setEstadoLogico(Constantes.BAJA);
		actualizar(articulo);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Articulo> getAllArticulo() throws HibernateException {
		List<Articulo> articulos = getAll(Articulo.class);

		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(Articulo.class);
			criteria.add(Restrictions.eq("estadoLogico", "A"));
			criteria.addOrder(Order.asc("descripcion"));
			articulos = (List<Articulo>) criteria.list();

		} catch (Exception e) {
			logger.error("Error en " + getClass());
		} finally {
			this.getSession().close();
		}

		return articulos;
	}

}
